<?php


namespace app\admin\controller;


use app\BaseController;
use think\exception\HttpResponseException;

/**
 * 控制器的基类
 * Class Base
 * @package app\admin\controller
 */
class Base extends BaseController
{

    /**
     * 不需要登即可打开录的请求
     */
    private static $notNeedLogin = [
        '/admin/index/login'
    ];

    /**
     * 只需要登录即可访问，不用验证权限的请求
     */
    private static $needLogin = [
        '/admin/index/index', //主界面
        '/admin/index/welcome', //欢迎页面
        '/admin/admin/baseinfo', //基础信息
        '/admin/admin/editpsw', //修改密码
        '/admin/index/logout', //退出系统
        '/admin/menu/init', //获取用户的菜单
    ];

    /**
     * 用户拥有的权限
     */
    private static $authUrl = [
        '/admin/group/index', //分组管理的列表页面
        '/admin/menu/index', //菜单管理的列表页面
    ];

    /**
     * 初始化
     */
    protected function initialize()
    {
        parent::initialize(); // TODO: Change the autogenerated stub

        //获取当前用户访问的连接
        $req  = request();
        $root = $req->root();//获取应用名称
        $ctrl = $req->controller();//获取控制器名称
        $fn   = $req->action();//获取方法名称

        $nowUrl = strtolower($root.'/'.$ctrl.'/'.$fn);//当前用户访问的连接

        //判断当前访问的链接是否为不需要登录
        if(in_array($nowUrl,self::$notNeedLogin)){
            return true;//如果是则放行
        }

        //判断当前是否已经登录
        if(!session('?user')){
            return self::redirect((string)url('admin/index/login'),302);//由于用户没有登录，所以跳转到登录页面
        }

        //判断当前访问的链接是否为登录即可，不用验证权限的请求
        if(in_array($nowUrl,self::$needLogin)){
            return true;//如果是则放行
        }

        $usergroup = \app\admin\model\Usergroup::where('user_id', session('user_id'))->find();//获取分组编号
        $group = \app\admin\model\Group::find($usergroup['group_id']);//获取权限（菜单编号）
        if($group['menu_ids'] == '*'){
            return true;//如果是超级管理员则直接放行，不验证权限
        }

        $menuList = getMenus();
        self::$authUrl = getAuthUrl($menuList);

        //判断用户有无权限访问此链接
        if(in_array($nowUrl,self::$authUrl)){
            return true;//如果有则放行
        }

        //强制跳转到404页面
        return $this->redirect((string)url('admin/error/err_404'),404);

    }

    /**
     * 手动抛出异常
     * @param ...$arr
     */
    private static function redirect(...$arr){
        throw new HttpResponseException(redirect(...$arr));
    }


}